package com.dao;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Restrictions;
import org.jfree.util.Log;
import org.springframework.dao.DataAccessException;

import com.model.Parametro;
import com.model.Producto;
import com.query.ProductoQuery;
import com.util.FilesystemUtil;

public class ProductoDAOImpl extends BaseHibernateDAO<Producto, ProductoQuery> {

	private static final String directorioPorDefecto = "C:\\";
	private static final String directorioConfigurado = "directorioFotos";

	private BaseModelDAO<Parametro> parametroDao;
	private String rutaDirectorioFotos;

	@Override
	public Class<Producto> getModelClass() {
		return Producto.class;
	}

	@Override
	public List<String> getListNames() {
		List<String> list = new ArrayList<String>();
		return list;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Producto> getList(String query) throws DataAccessException {
		List<Producto> list = null;

		DetachedCriteria criteria = DetachedCriteria.forClass(Producto.class);

		criteria.add(Restrictions.or(
				Restrictions.ilike("codigoProducto", query, MatchMode.START),
				Restrictions.ilike("detalle", query, MatchMode.START)));

		list = (List<Producto>) getHibernateTemplate().findByCriteria(criteria);
		return list;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Producto> getList(Object query) throws DataAccessException {
		ProductoQuery productoQuery = (ProductoQuery) query;
		List<Producto> list = null;

		DetachedCriteria criteria = DetachedCriteria.forClass(Producto.class);

		criteria.add(Restrictions.eq("familia.id", productoQuery.getFamiliaID()));

		list = (List<Producto>) getHibernateTemplate().findByCriteria(criteria);
		return list;
	}

	@Override
	public Producto edit(Producto object) throws DataAccessException {
		if (object != null) {
			String nombre = "foto" + new Date().getTime() + ".jpg";
			if (object.getImagen() != null) {
				Parametro parametro = parametroDao.get(directorioConfigurado);

				if (parametro.getValor() != null
						&& !parametro.getValor().equals("")) {
					rutaDirectorioFotos = parametro.getValor();
				} else {
					rutaDirectorioFotos = directorioPorDefecto;
				}

				try {
					FilesystemUtil.escribirArchivo(rutaDirectorioFotos, nombre,
							object.getImagen());
					// borro el archivo cargado actual
					FilesystemUtil.borrarArchivo(object.getRutaArchivo(),
							object.getNombreArchivo());
				} catch (Exception e) {
					Log.error("Error al guardar el archivo adjunto: ", e);
				}
				object.setRutaArchivo(rutaDirectorioFotos);
				object.setNombreArchivo(nombre);
			}

			getHibernateTemplate().merge(object);
		}
		return object;
	}

	@Override
	public void delete(Producto object) throws DataAccessException {
		if (object.getNombreArchivo() != null
				&& !"".equals(object.getNombreArchivo())) {

			Parametro parametro = parametroDao.get(directorioConfigurado);

			if (parametro.getValor() != null
					&& !parametro.getValor().equals("")) {
				rutaDirectorioFotos = parametro.getValor();
			} else {
				rutaDirectorioFotos = directorioPorDefecto;
			}

			try {
				FilesystemUtil.borrarArchivo(object.getRutaArchivo(),
						object.getNombreArchivo());
			} catch (Exception e) {
				Log.error("Error al borrar el archivo adjunto: ", e);
			}
		}
		getHibernateTemplate().delete(object);
	}

	public BaseModelDAO<Parametro> getParametroDao() {
		return parametroDao;
	}

	public void setParametroDao(BaseModelDAO<Parametro> parametroDao) {
		this.parametroDao = parametroDao;
	}

}
